普通数组与vector数组相互转换

​引言

vector是C++标准模板库中提供的一种能够操作多种数据结构的向量容器模板类。相对于C++语言中的普通数组,vector除了数组的大小可根据元素个数的多少动态改变外,它更大的优势或者说更吸引我们的是,它内部提供了大量的优化算法,如排序、查找、删除/替换、数值运算等等。另外,同普通数组一样,vector数组中内部元素采用的是连续存储空间来存储的,所以,也可以通过下标来访问其中的某个元素。

那么,对于我们程序中定义的普通数组,能不能将其转换为vector数组,或者说与vector数组混合使用,并利用它内部提供的各种算法呢?这种需求场合还是挺多的,如我们可能会写某个算法函数,然后将其封装成动态链接库DLL文件供其它程序调用。在DLL函数的参数类型定义中,一般我们不会将其定义成c++语言专用的如class、vector等类型,而是定义成通用的数据如int、double等类型,否则,在其它语言如python、LabVIEW等环境中调用DLL的时候,将不能正确识别参数的数据类型。

解决思路

实现将普通数组转换为vector数组并利用它内部提供的各种算法的目的,这里面涉及到两个重要环节:

怎样将普通数组的值传递到vector数组中?

使用vector的提供的各种算法进行处理后,得到的是vector类型的数组,怎么将其再转换为普通数组?

下面对这两个问题逐步说明。

普通数组转换为vector数组

假定普通数组为a定义为:double a[N],N为元素个数,转换后的vector数组定义为vector<int> v,则将a的所有元素传递到v的方式有以下两种:

1. 定义v时直接赋值,代码为:

vector<int> v(a, a+N);

2. 先定义v,其元素个数为N,再使用memcpy将a的值拷贝到v中,代码为:

​vector<int> v(N);

​memcpy(&v[0], a, sizeof(a));

第2种方法能实现的原因是,vector数组中内部元素采用的是连续内存空间存储的,所以只要找到第一个元素的地址即&v[0]后,即可用memcpy将a中所有的元素拷贝到v中。

vector数组转换为普通数组

将处理后的vector类型的数组再转换为普通数组,可参考上面的第2种方法,用memcpy函数即可实现,代码如下:

​memcpy(a, &v[0], sizeof(a));

代码测试实例

#include <iostream> 
#include <time.h> 
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std; 
const int N = 10;
void displayData(int *x, int n,string title)
{
	cout<<title.c_str()<<endl; 
	for(int i=0; i<n; i++)
	{
		cout<<x[i]<<"\t";
	}
	cout<<endl;
}

int main()
{
	srand((unsigned int)time(NULL)); 
	int a[N];
	for(int i=0; i<N; i++)
	{
		a[i] = rand()%100;
	}
	displayData (a,N,"a:");
	vector<int> v(a, a+N);
	// vector<int> v(N);
	// memcpy(&v[0], a, sizeof(a));
	cout<<"sum(a) = "<<accumulate(v.begin(),v.end(),0)<<endl<<endl;
	sort(v.begin(),v.end()); 
	displayData(&v[0],N,"v:");
	memcpy(a,&v[0],sizeof(a));
	displayData(a,N,"sort(a):");
	getchar(); 
	return 0;
}

下面通过一个例子说明上面思路的可行性,例子中综合使用了普通数组和vector数组,代码如下:

C++语言进阶知识:普通数组原来也可以和vector数组一起使用

主要代码部分说明如下:

第1-5行,包含的相关头文件,使用vector数组必须包含<vector>,程序中使用了其通用算法和数值运算,所有也包含了<algorithm>和<numeric>

第7行,声明使用std名称空间

第8行,定义数组的大小N为10个元素,注意,要加前缀定义为const常量整数,因为后面定义普通数组大小时,其数组大小值必须为常数

第10-18行,定义一个子函数displayData,用于打印显示出数组中的所有元素

第22-27行,定义长度为10的普通数组a,并为每个元素赋值为0-100之间的随机整数

第30-32行,将普通数组的值传递给vector数组v,其中第30行是用的第1种方法,注释的31-32行是使用的第2种方法,这两种方法是完全等价的

第33行,使用vector数组的数值运算函数accumulate,计算数组a的所有元素之和并输出

第35-36行,使用vector数组的排序函数sort,对vector数组v中的元素进行排序并输出

第38-39行,将排序后vector数组的元素使用memcpy函数再传递到普通数组a中,并输出a中元素的值

经过上面的代码后,就完成了普通数组到vector数组的相互转换,其运行结果如下:

C++语言进阶知识:普通数组原来也可以和vector数组一起使用

​总结

从上面的例子中可看出,在一个程序中完全可以将普通数组和vector数组混合使用,充分利用C++模板库中提供的强大的函数库,来简化我们的程序代码,最后再将处理后的结果以普通形式的数组进行输出,以作它用。

本页共37段,1815个字符,4332 Byte(字节)